package com.hanlin.tank;

import java.awt.*;
import java.util.Random;

/**
 * 坦克类
 *
 * @Author: hl.yuan
 * @Date: 2022/2/4 12:07
 */
public class Tank {
    /**
     * 坦克的坐标
     */
    private int x;
    /**
     * 坦克的坐标
     */
    private int y;
    /**
     * 坦克的方向
     */
    private Dir dir = Dir.DOWN;
    /**
     * 坦克运行的速度
     */
    private static final int SPEED = 5;
    /**
     * 坦克是否在移动：false静止状态，true移动状态。
     */
    private boolean moving = true;
    /**
     * 判断坦克是否活着
     */
    private boolean living = true;
    /**
     * 随机工具类
     */
    private Random random = new Random();
    /**
     * 敌我标识
     */
    private Group group = Group.BAD;

    private TankFrame tf = null;

    Rectangle rectangle = new Rectangle();

    public Group getGroup() {
        return group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }

    public boolean isMoving() {
        return moving;
    }

    public void setMoving(boolean moving) {
        this.moving = moving;
    }

    public Dir getDir() {
        return dir;
    }

    public void setDir(Dir dir) {
        this.dir = dir;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    /**
     * 坦克的构造方法
     *
     * @param x
     * @param y
     * @param dir
     */
    public Tank(int x, int y, Dir dir, Group group, TankFrame tf) {
        this.x = x;
        this.y = y;
        this.dir = dir;
        this.tf = tf;
        this.group = group;

        rectangle.x = this.x;
        rectangle.y = this.y;
        rectangle.width = GlobalVariables.tankW;
        rectangle.height = GlobalVariables.tankH;
    }

    /**
     * 画出坦克
     *
     * @param g 画笔
     */
    public void paint(Graphics g) {
        // 在画出坦克前，需要判断坦克是否存活，如果坦克已经死亡了，就需要移除坦克。
        if (!living) {
            tf.tankList.remove(this);
        }

        /**
         * X: 坐标
         * Y: 坐标
         */
//        g.setColor(Color.YELLOW);
//        g.fillRect(x, y, 50, 50);

        if (dir.equals(Dir.LEFT)) {
            g.drawImage(this.group == group ? PropertyMgr.goodTankL : PropertyMgr.badTankL, x, y, null);
        }
        // 上键
        if (dir.equals(Dir.UP)) {
            g.drawImage(this.group == group ? PropertyMgr.goodTankU : PropertyMgr.badTankU, x, y, null);
        }
        // 右键
        if (dir.equals(Dir.RIGHT)) {
            g.drawImage(this.group == group ? PropertyMgr.goodTankR : PropertyMgr.badTankR, x, y, null);
        }
        // 下键
        if (dir.equals(Dir.DOWN)) {
            g.drawImage(this.group == group ? PropertyMgr.goodTankD : PropertyMgr.badTankD, x, y, null);
        }

        move();
    }

    /**
     * 坦克移动
     */
    private void move() {
        // 如果坦克是静止状态，就直接return掉，不进行移动。
        if (!moving) {
            return;
        }
        // 左键
        if (dir.equals(Dir.LEFT)) {
            x -= SPEED;
        }
        // 上键
        if (dir.equals(Dir.UP)) {
            y -= SPEED;
        }
        // 右键
        if (dir.equals(Dir.RIGHT)) {
            x += SPEED;
        }
        // 下键
        if (dir.equals(Dir.DOWN)) {
            y += SPEED;
        }

        // 坦克移动的时候打出子弹
        if (random.nextInt(10) > 8 && this.group == Group.BAD) {
            this.fire();
        }

        if (this.group == Group.BAD && random.nextInt(100) > 95) {
            // 随机换方向
            randomDir();
        }
        // 边界检查
        boundsCheck();

        rectangle.x = this.x;
        rectangle.y = this.y;
    }

    /**
     * 边界检查
     */
    private void boundsCheck() {
        if (this.x < 0) {
            x = 0;
        }
        if (this.y < 30) {
            y = 30;
        }
        if (this.x > GlobalVariables.GAME_WIDTH - GlobalVariables.bulletW) {
            x = GlobalVariables.GAME_WIDTH - GlobalVariables.bulletW;
        }
        if (this.y > GlobalVariables.GAME_HEIGHT - GlobalVariables.bulletH) {
            y = GlobalVariables.GAME_HEIGHT - GlobalVariables.bulletH;
        }
    }

    /**
     * 随机换方向
     */
    private void randomDir() {
        this.dir = Dir.values()[random.nextInt(4)];
    }

    /**
     * 坦克发射子弹
     */
    public void fire() {

        int tX = x + GlobalVariables.tankW / 2 - GlobalVariables.bulletW / 2 + 1;
        int tY = y + GlobalVariables.tankH / 2 - GlobalVariables.bulletH / 2;

        tf.bulletList.add(new Bullet(tX, tY, this.dir, this.group, tf));
    }

    /**
     * 坦克死亡
     */
    public void die() {
        this.living = false;

    }
}
